java Android应用程序等待通知奇怪行为
片段必须等待位图在另一个线程中呈现。为了“提高”性能,我先显示片段,然后从另一个线程粘贴图像。位图线程可能更快,或者片段创建速度更快(哪种更好)。我想在将来创建片段时运行代码,并且可以将位图附加到ImageView
所以我试着用等待和通知来解决这个问题。
服务员线程告诉我位图为空,但在notify线程中,位图被分配给a地址。为什么一个线程正在给我打印一个地址,而另一个线程却在等待(UI线程,onViewCreated()
)告诉我地址为空
代码:
private static final Object objectWaiterForImage = new Object();
public void onBitmapReady(Bitmap bitmap)
{
bitmapLastPic = bitmap;
synchronized (objectWaiterForImage)
{
System.out.println("DHH: Calling notify " + objectWaiterForImage);
objectWaiterForImage.notifyAll();
System.out.println("DHH: notify called " + objectWaiterForImage);
System.out.println("DHH: notify called null check " + bitmapLastPic);
}
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState)
{
super.onViewCreated(view, savedInstanceState);
new Thread(new Runnable()
{
@Override
public void run()
{
try
{
synchronized (objectWaiterForImage)
{
while(bitmapLastPic == null)
{
System.out.println("DHH: waiting " + objectWaiterForImage);
objectWaiterForImage.wait();
System.out.println("DHH: waiting end " + objectWaiterForImage);
}
new Handler(Looper.getMainLooper()).post(new Runnable() {
@Override
public void run() {
System.out.println("DHH: setting bitmap");
imageView.getSource().setImageBitmap(bitmapLastPic);
listener.onBitmapReady();
}
});
}
}
catch (Exception ec)
{
System.out.println("onViewCreated() failed: " + ec);
}
}
}).start();
show();
}
目标是让片段监听另一个线程完成,并显示位图。防止工作线程在片段完成自身创建之前完成。我这么做的原因是,用户不应该等待页面太久。因此,它首先显示ui,几毫秒后显示最终渲染的图像
共 (0) 个答案